package com.estar.assistsurvy.service;

import java.util.List;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.estar.assistsurvy.entity.RequestLoc;
import com.estar.assistsurvy.utils.MightypleUtil;
import com.estar.assistsurvy.utils.OkHttpUtils;
import com.google.gson.Gson;
import com.baidu.location.Poi;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Handler;
import android.os.IBinder;
import android.os.StrictMode;
import android.util.Log;

public class getLocationService extends Service {

	private LocationClient mLocationClient;
	private BDLocationListener myListener;
	private double latitude,longitude;
	private String adress;
	private SharedPreferences share,locPrefer;
	private Editor editor;
	private String uuid,deviceId,phoneNumber;
	public static final String OPEN_ACTION="com.estar.receiver.GPS_OPEN";
	public static final String CLOSE_ACTION="com.estar.receiver.GPS_CLOSE";
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		mLocationClient=new LocationClient(getApplicationContext());
		initLocation();
		myListener=new MyLocationListener();
		mLocationClient.registerLocationListener(myListener);

//		share=getSharedPreferences("user", MODE_PRIVATE);
//		uuid=share.getString("uuid", "");
//		phoneNumber=share.getString("phoneNumber", "");
		
		locPrefer=getSharedPreferences("location", MODE_PRIVATE);
		editor=locPrefer.edit();
		
		deviceId=MightypleUtil.getDeviceId(getApplicationContext());
		StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
		StrictMode.setThreadPolicy(policy);
		runnable.run();
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		mLocationClient.start();
		mLocationClient.requestLocation();
		
		
		try {
			//注册receiver，接收Activity发送的广播，停止线程，停止runnable
			myReceiver = new MyGpsReceiver();
			IntentFilter filter = new IntentFilter();
			filter.addAction(OPEN_ACTION);
			filter.addAction(CLOSE_ACTION);
			registerReceiver(myReceiver, filter);
		} catch (Exception e) {
			// TODO: handle exception
		}
		return super.onStartCommand(intent, flags, startId);
	}
	private MyGpsReceiver myReceiver;
	class MyGpsReceiver extends BroadcastReceiver{

		@Override
		public void onReceive(Context context, Intent intent) {
			try {
				// TODO Auto-generated method stub
				if (intent.getAction().equals(OPEN_ACTION)) {
					runnable.run();
				} else if (intent.getAction().equals(CLOSE_ACTION)) {
					handler.removeCallbacks(runnable);
				} 
			} catch (Exception e) {
				// TODO: handle exception
			}
		}
		
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		mLocationClient.stop();
		unregisterReceiver(myReceiver);
	}

	private void initLocation(){
		LocationClientOption option = new LocationClientOption();
		option.setLocationMode(LocationMode.Hight_Accuracy
				);//可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
		option.setCoorType("bd09ll");//可选，默认gcj02，设置返回的定位结果坐标系
		int span=10000;
		option.setScanSpan(span);//可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的
		option.setIsNeedAddress(true);//可选，设置是否需要地址信息，默认不需要
		option.setOpenGps(true);//可选，默认false,设置是否使用gps
		option.setLocationNotify(true);//可选，默认false，设置是否当gps有效时按照1S1次频率输出GPS结果
		option.setIsNeedLocationDescribe(true);//可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”
		option.setIsNeedLocationPoiList(true);//可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
		option.setIgnoreKillProcess(false);//可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死  
		option.SetIgnoreCacheException(false);//可选，默认false，设置是否收集CRASH信息，默认收集
		option.setEnableSimulateGps(false);//可选，默认false，设置是否需要过滤gps仿真结果，默认需要
		mLocationClient.setLocOption(option);
	}

	private class MyLocationListener implements BDLocationListener {

		@Override
		public void onReceiveLocation(BDLocation location) {
			//Receive Location
			StringBuffer sb = new StringBuffer(256);
			sb.append("time : ");
			sb.append(location.getTime());
			sb.append("\nerror code : ");
			sb.append(location.getLocType());
			sb.append("\nlatitude : ");
			sb.append(location.getLatitude());
			latitude=location.getLatitude();
			editor.putString("latitude", latitude+"");
//			Log.i("wl", "latitude--->"+latitude);
			sb.append("\nlontitude : ");
			sb.append(location.getLongitude());
			longitude=location.getLongitude();
			editor.putString("longitude", longitude+"");
			editor.commit();
//			Log.i("wl", "longitude--->"+longitude);
			sb.append("\nradius : ");
			sb.append(location.getRadius());
			if (location.getLocType() == BDLocation.TypeGpsLocation){// GPS定位结果
				sb.append("\nspeed : ");
				sb.append(location.getSpeed());// 单位：公里每小时
				sb.append("\nsatellite : ");
				sb.append(location.getSatelliteNumber());
				sb.append("\nheight : ");
				sb.append(location.getAltitude());// 单位：米
				sb.append("\ndirection : ");
				sb.append(location.getDirection());// 单位度
				sb.append("\naddr : ");
				sb.append(location.getAddrStr());
				adress=location.getAddrStr();
				editor.putString("adress", adress);
				editor.commit();
//				Log.i("wl", "adress--->"+adress);
				sb.append("\ndescribe : ");
				sb.append("gps定位成功");

			} else if (location.getLocType() == BDLocation.TypeNetWorkLocation){// 网络定位结果
				sb.append("\naddr : ");
				sb.append(location.getAddrStr());
				//运营商信息
				sb.append("\noperationers : ");
				sb.append(location.getOperators());
				sb.append("\ndescribe : ");
				sb.append("网络定位成功");
			} else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
				sb.append("\ndescribe : ");
				sb.append("离线定位成功，离线定位结果也是有效的");
			} else if (location.getLocType() == BDLocation.TypeServerError) {
				sb.append("\ndescribe : ");
				sb.append("服务端网络定位失败，可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com，会有人追查原因");
			} else if (location.getLocType() == BDLocation.TypeNetWorkException) {
				sb.append("\ndescribe : ");
				sb.append("网络不同导致定位失败，请检查网络是否通畅");
			} else if (location.getLocType() == BDLocation.TypeCriteriaException) {
				sb.append("\ndescribe : ");
				sb.append("无法获取有效定位依据导致定位失败，一般是由于手机的原因，处于飞行模式下一般会造成这种结果，可以试着重启手机");
			}
			sb.append("\nlocationdescribe : ");
			sb.append(location.getLocationDescribe());// 位置语义化信息
			List<Poi> list = location.getPoiList();// POI数据
			if (list != null) {
				sb.append("\npoilist size = : ");
				sb.append(list.size());
				for (Poi p : list) {
					sb.append("\npoi= : ");
					sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
				}
//				Log.i("wl", "Poi--->"+list.get(0).getName());
				editor.putString("Poi", list.get(0).getName());
				editor.commit();
			}
			//		Log.i("wl", sb.toString());
		}
	}
	
	private Handler handler=new Handler();
	private Runnable runnable=new Runnable() {

		@Override
		public void run() {
			// TODO Auto-generated method stub
			share=getSharedPreferences("user", MODE_PRIVATE);
			uuid=share.getString("uuid", "");
			phoneNumber=share.getString("phoneNumber", "");
			RequestLoc loc=new RequestLoc(deviceId, uuid, 
					String.valueOf(longitude), String.valueOf(latitude), "P1012", phoneNumber);
//			RequestLoc loc=new RequestLoc(deviceId, uuid, 
//					"116.342642", "39.589853", "P1012", phoneNumber);
			
			String json=new Gson().toJson(loc);
//			Log.i("wl", "上传经纬度报文--》"+json);
			new OkHttpUtils().postRequest(json);
			handler.postDelayed(runnable, 10000);

		}
	};

}
